/*
 * Copyright 2009 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package simple.runtime.components;

import simple.runtime.annotations.SimpleFunction;
import simple.runtime.annotations.SimpleObject;
import simple.runtime.annotations.SimpleProperty;

/**
 * 可见的Simple组件。
 * 
 * @author Herbert Czymontek
 */
@SimpleObject
public interface 可视组件 extends 组件 {

	// 可视组件 基础属性定义

	/**
	 * 标识属性获取方法。
	 * 
	 * @return 返回当前可视组件的标识，注意{@code -1}为无标识
	 */
	@SimpleProperty
	int 标识();

	/**
	 * 标识属性设置方法。
	 * 
	 * @param 标识 设置可视组件的标识，注意{@code -1}为无标识
	 */
	@SimpleProperty
	void 标识(int id);

	/**
	 * 可视的获取属性方法。
	 *
	 * @return 返回组件的可视状态。
	 */
	@SimpleProperty
	boolean 可视();

	/**
	 * 可视的属性设置方法。
	 *
	 * @param visible 欲设置组件的可视状态。
	 */
	@SimpleProperty
	void 可视(boolean visible);

  /**
   * 宽度属性获取器方法。
   * 
   * @return  布局所使用的宽度属性
   */
  @SimpleProperty
  int 宽度();
  
  /**
   * 宽度属性设置器方法。
   * 
   * @param width  布局所使用的宽度属性
   */
  @SimpleProperty
  void 宽度(int width);

  /**
   * 高度属性获取器方法。
   * 
   * @return  布局所使用的高度属性
   */
  @SimpleProperty
  int 高度();

  /**
   * 高度属性设置器方法。
   * 
   * @param height  布局所使用的高度属性
   */
  void 高度(int height);

  // 背景相关

  /**
   * 背景颜色属性获取器方法。
   *
   * @return  具有Alpha的背景RGB颜色
   */
  @SimpleProperty
  int 背景颜色();

  /**
   * 背景颜色属性设置器方法。
   *
   * @param argb  具有Alpha的背景RGB颜色
   */
  @SimpleProperty(type = SimpleProperty.PROPERTY_TYPE_COLOR)
  void 背景颜色(int argb);

	/**
	 * 背景图片属性获取器方法。
	 *
	 * @return 图片路径或图片标识
	 */
	@SimpleProperty
	String 背景图片();

	/**
	 * 背景图片属性设置器方法。
	 *
	 * @param image 图片，支持{@code 资源标识}、{@code @drawable/资源名}、
	 * 				{@code 资产文件名}、{@code /外部文件名}
	 */
	@SimpleProperty(type = SimpleProperty.PROPERTY_TYPE_ASSET,
			initializer = "\"\"")
	void 背景图片(String image);

  // 填充相关，该布局参数支持所有布局

	/**
	 * 左填充属性获取方法。
	 * 
	 * @return 左填充
	 */
	@SimpleProperty
	int 左填充();

	/**
	 * 左填充属性设置器方法。
	 * 
	 * @param leftPadding 左填充
	 */
	@SimpleProperty
	void 左填充(int leftPadding);

	/**
	 * 顶填充属性获取器方法。
	 * 
	 * @return  顶填充
	 */
	@SimpleProperty
	int 顶填充();

	/**
	 * 顶填充属性设置器方法。
	 * 
	 * @param topPadding  顶填充
	 */
	@SimpleProperty
	void 顶填充(int topPadding);

	/**
	 * 右填充属性获取器方法。
	 * 
	 * @return  右填充
	 */
	@SimpleProperty
	int 右填充();

	/**
	 * 右填充属性设置器方法。
	 * 
	 * @param rightPadding 右填充
	 */
	@SimpleProperty
	void 右填充(int rightPadding);

	/**
	 * 底填充属性获取器方法。
	 * 
	 * @return  底填充
	 */
	@SimpleProperty
	int 底填充();

	/**
	 * 底填充属性设置器方法。
	 * 
	 * @param bottomPadding 底填充
	 */
	@SimpleProperty
	void 底填充(int bottomPadding);

	/**
	 * 设置组件的填充。
	 * 
	 * @param leftPadding 左填充
	 * @param topPadding 顶填充
	 * @param rightPadding 右填充
	 * @param bottomPadding 底填充
	 */
	@SimpleFunction
	void 置填充(int leftPadding, int topPadding, int rightPadding, int bottomPadding);

	// 边距相关，该布局参数支持所有布局

	/**
	 * 左边距属性获取方法。
	 * 
	 * @return 左边距
	 */
	@SimpleProperty
	int 左边距();

	/**
	 * 左边距充属性设置方法。
	 * 
	 * @param leftMargin 左边距
	 */
	@SimpleProperty
	void 左边距(int leftMargin);

	/**
	 * 顶边距属性获取方法。
	 * 
	 * @return 顶边距
	 */
	@SimpleProperty
	int 顶边距();

	/**
	 * 顶边距充属性设置方法。
	 * 
	 * @param topMargin 顶边距
	 */
	@SimpleProperty
	void 顶边距(int topMargin);

	/**
	 * 右边距属性获取方法。
	 * 
	 * @return 右边距
	*/
	@SimpleProperty
	int 右边距();

	/**
	 * 右边距充属性设置方法。
	 * 
	 * @param rightMargin 右边距
	 */
	@SimpleProperty
	void 右边距(int rightMargin);

	/**
	 * 底边距属性获取方法。
	 * 
	 * @return 底边距
	 */
	@SimpleProperty
	int 底边距();

	/**
	 * 底边距属性设置方法。
	 * 
	 * @param margin 底边距
	 */
	@SimpleProperty
	void 底边距(int bottomMargin);

	/**
	 * 设置组件的边距。
	 * 
	 * @param leftMargin 左边距
	 * @param topMargin 顶边距
	 * @param rightMargin 右边距
	 * @param bottomMargin 底边距
	 */
	@SimpleFunction
	void 置边距(int leftMargin, int topMargin, int rightMargin, int bottomMargin);

  // 对齐相关，该布局参数仅支持：线性布局、单帧布局、表格布局

	/**
	 * 对齐属性获取方法。
	 * 
	 * <p>仅限位于{@code 线性布局}、{@code 单帧布局}、{@code 表格布局}中时可用。
	 * 
	 * @return	返回值请参考{@link 组件#对齐_左}等
	 */
	@SimpleProperty
	int 对齐();
	
	/**
	 * 对齐属性设置方法。
	 * 
	 * <p>仅限位于{@code 线性布局}、{@code 单帧布局}、{@code 表格布局}中时可用。
	 *
	 * @param justification	可选值请参考{@link 组件#对齐_左}等
	 */
	@SimpleProperty
	void 对齐(int justification);

  // 权重相关，该布局参数仅支持：线性布局

	/**
	 * 权重属性获取方法。
	 * 
	 * <p>仅限位于{@code 线性布局}中时可用。
	 * 
	 * @return 权重
	 */
	@SimpleProperty
	float 权重();

	/**
	 * 权重属性设置方法：简单可以把该属性理解为占比。
	 * 
	 * <p>仅限位于{@code 线性布局}中时可用。
	 * 
	 * <p>注意该属性值受{@link 线性布局#权重总和(float)}、
	 * {@link 可视组件#宽度(int)}或{@link 可视组件#高度(int)}影响
	 * 
	 * @param weight 权重
	 */
	@SimpleProperty
	void 权重(float weight);

  // 行和列相关，该布局参数仅支持：表格布局

  /**
   * 行属性获取器方法。
   * 
   * @return  表布局使用的行
   */
  @SimpleProperty
  int 行();
  
  /**
   * 行属性设置器方法。
   * 
   * @param row 表布局使用的行
   */
  @SimpleProperty(type = SimpleProperty.PROPERTY_TYPE_INTEGER,
                  initializer = 组件.布局_无_行 + "")
  void 行(int row);
  
  /**
   * 列属性获取器方法。
   * 
   * @return  表布局所使用的列
   */
  @SimpleProperty
  int 列();
  
  /**
   * 列属性设置器方法。
   * 
   * @param column  表布局所使用的列
   */
  @SimpleProperty(type = SimpleProperty.PROPERTY_TYPE_INTEGER,
                  initializer = 组件.布局_无_列 + "")
  void 列(int column);

}
